#posttype reorder #drag-and-dropreordering #quicklyreorganize content #re-order
Post Type Reorder - Simple Drag and Drop Ordering for WordPress<?php // Add Re-Order submenu to each post type function add_reorder_submenu() { $post_types = get_post_types(array('show_ui' => true), 'objects'); foreach ($post_types as $post_type) { // Skip the attachment post type if ($post_type->name === 'attachment') { continue; } $parent_slug = ($post_type->name === 'post') ? 'edit.php' : 'edit.php?post_type=' . $post_type->name; add_submenu_page( $parent_slug, 'Re-Order ' . $post_type->label, 'Re-Order', 'edit_posts', $post_type->name . '-reorder', 'display_reorder_page' ); } } add_action('admin_menu', 'add_reorder_submenu'); // Display the reorder page function display_reorder_page() { if (!current_user_can('edit_posts')) { wp_die(__('You do not have sufficient permissions to access this page.')); } $current_screen = get_current_screen(); $post_type = $current_screen->post_type; if (empty($post_type)) { $post_type = sanitize_text_field($_GET['post_type'] ?? 'post'); } $post_type_object = get_post_type_object($post_type); if (!$post_type_object || $post_type === 'attachment') { wp_die(__('Invalid post type.')); } $query_args = array( 'post_type' => $post_type, 'post_status' => array('publish', 'draft', 'pending', 'future', 'private'), 'posts_per_page' => -1, 'orderby' => 'menu_order', 'order' => 'ASC', 'suppress_filters' => true, ); $posts = get_posts($query_args); $total_items = count($posts); ?> <div class="wrap"> <h1><?php echo esc_html(sprintf('Re-Order %s', $post_type_object->labels->name)); ?></h1> <div id="message" class="updated notice is-dismissible" style="display:none;"><p></p></div> <p><?php esc_html_e('Drag and drop items to reorder them. Click "Update Order" to save changes.'); ?></p> <button id="update-order" class="button button-primary"><?php esc_html_e('Update Order'); ?></button> <button id="reset-order" class="button"><?php esc_html_e('Reset Order'); ?></button> <p class="item-count"><?php esc_html_e('Total items:'); ?> <span id="total-items"><?php echo esc_html($total_items); ?></span></p> <ul id="sortable-list" class="widefat striped"> <?php foreach ($posts as $post) : $title = $post->post_title; $status = get_post_status($post->ID); $status_class = ($status !== 'publish') ? sprintf(' post-status-%s', sanitize_html_class($status)) : ''; ?> <li class="ui-state-default<?php echo esc_attr($status_class); ?>" data-id="<?php echo esc_attr($post->ID); ?>"> <span class="dashicons dashicons-menu"></span> <?php echo esc_html($title); ?> <span class="post-status">(<?php echo esc_html($status); ?>)</span> </li> <?php endforeach; ?> </ul> <p class="reorder-footer"> <?php echo wp_kses( sprintf( 'Created by <a href="%s" target="_blank">Yasir Shabbir</a>', 'https://yasirshabbir.com' ), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ); ?> </p> </div> <style> #sortable-list { list-style-type: none; margin: 20px 0; padding: 0; } #sortable-list li { padding: 10px 15px !important; background: #fff; border: 1px solid #ddd; margin-bottom: 5px; cursor: move; font-size: 14px !important; line-height: 1.4; } #sortable-list li:hover { background: #f9f9f9; } #sortable-list .dashicons { color: #bbb; margin-right: 10px; font-size: 20px; line-height: 1; } .ui-sortable-helper { background: #f9f9f9 !important; box-shadow: 0 2px 5px rgba(0,0,0,0.15); } #update-order, #reset-order { display: inline-block; margin-right: 10px; margin-bottom: 20px; } .updating { opacity: 0.5; pointer-events: none; } .post-status { font-size: 0.8em; color: #666; margin-left: 5px; } .post-status-draft { opacity: 0.7; } .post-status-pending { background-color: #fef7f1; } .post-status-future { background-color: #f1fef7; } .post-status-private { background-color: #fef1f1; } .item-count { margin-top: 10px; font-weight: bold; } .reorder-footer { margin-top: 20px; text-align: center; font-style: italic; color: #666; } </style> <script> jQuery(document).ready(function($) { $("#sortable-list").sortable({ handle: ".dashicons-menu" }); function updateOrder(action, buttonId) { var $button = $("#" + buttonId); var $list = $("#sortable-list"); var order = $list.sortable("toArray", {attribute: "data-id"}); $button.addClass("updating").text(action === "update_post_order" ? "<?php esc_html_e('Updating...'); ?>" : "<?php esc_html_e('Resetting...'); ?>"); $list.addClass("updating"); $.ajax({ url: ajaxurl, type: "POST", data: { action: action, order: order, post_type: <?php echo wp_json_encode($post_type); ?>, security: <?php echo wp_json_encode(wp_create_nonce('post_order_nonce')); ?> }, success: function(response) { if (response.success) { $("#message").html("<p>" + response.data + "</p>").show(); if (action === "reset_post_order") { location.reload(); } } else { $("#message").html("<p><?php esc_html_e('Error:'); ?> " + response.data + "</p>").show(); } }, error: function() { $("#message").html("<p><?php esc_html_e('An error occurred.'); ?></p>").show(); }, complete: function() { $button.removeClass("updating").text(action === "update_post_order" ? "<?php esc_html_e('Update Order'); ?>" : "<?php esc_html_e('Reset Order'); ?>"); $list.removeClass("updating"); } }); } function updateItemCount() { var count = $("#sortable-list li").length; $("#total-items").text(count); } $("#update-order").click(function() { updateOrder("update_post_order", "update-order"); }); $("#reset-order").click(function() { if (confirm("<?php esc_html_e('Are you sure you want to reset the order? This cannot be undone.'); ?>")) { updateOrder("reset_post_order", "reset-order"); setTimeout(updateItemCount, 500); } }); updateItemCount(); $("#sortable-list").on("DOMSubtreeModified", function() { updateItemCount(); }); }); </script> <?php } // AJAX handler to update post order function update_post_order() { check_ajax_referer('post_order_nonce', 'security'); $order = $_POST['order']; $post_type = $_POST['post_type']; if ($post_type === 'attachment') { wp_send_json_error('Reordering media items is not supported.'); return; } foreach ($order as $menu_order => $post_id) { wp_update_post(array( 'ID' => intval($post_id), 'menu_order' => intval($menu_order) )); } wp_send_json_success('Order updated successfully'); } add_action('wp_ajax_update_post_order', 'update_post_order'); // AJAX handler to reset post order function reset_post_order() { check_ajax_referer('post_order_nonce', 'security'); $post_type = $_POST['post_type']; if ($post_type === 'attachment') { wp_send_json_error('Reordering media items is not supported.'); return; } $posts = get_posts(array( 'post_type' => $post_type, 'posts_per_page' => -1, 'post_status' => 'any', )); foreach ($posts as $post) { wp_update_post(array( 'ID' => $post->ID, 'menu_order' => 0 )); } wp_send_json_success('Order reset successfully'); } add_action('wp_ajax_reset_post_order', 'reset_post_order'); // Update post order when posts are created or trashed function set_default_post_order($post_id, $post, $update) { if (!$update && $post->post_type !== 'attachment') { $post_type = get_post_type($post_id); $last_post = get_posts(array( 'post_type' => $post_type, 'posts_per_page' => 1, 'orderby' => 'menu_order', 'order' => 'DESC' )); $new_menu_order = (!empty($last_post)) ? $last_post[0]->menu_order + 1 : 0; wp_update_post(array( 'ID' => $post_id, 'menu_order' => $new_menu_order )); } } add_action('wp_insert_post', 'set_default_post_order', 10, 3);
star
photo_camera
Wed Sep 25 2024 00:20:34 GMT+0000 (Coordinated Universal Time)
#posttype reorder #drag-and-dropreordering #quicklyreorganize content #re-order